home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’97 / ComeBackHere / source code / main.c < prev   
Encoding:
C/C++ Source or Header  |  1997-06-28  |  6.7 KB  |  235 lines  |  [TEXT/CWIE]

  1. // main.c
  2.  
  3. #include <A4Stuff.h>
  4. #include <Resources.h>
  5. #include <Windows.h>
  6. #include <Controls.h>
  7.  
  8. short gPartCode;
  9. Boolean gRealFunctionsEnabled = true;
  10.  
  11. Handle gScrollDefProc;
  12. Boolean gScrollGoingUp;
  13. Boolean gKnowScrollDirection = false;
  14.  
  15. typedef pascal short (*findWindow)(Point thePoint, WindowRef *theWindow);
  16. findWindow gFindWindowAddr;
  17. pascal short MyFindWindow(Point thePoint, WindowRef *theWindow);
  18.  
  19. typedef pascal Boolean (*trackGoAway)(WindowRef theWindow, Point thePt);
  20. trackGoAway gTrackGoAwayAddr;
  21. pascal Boolean MyTrackGoAway(WindowRef theWindow, Point thePt);
  22.  
  23. typedef pascal Boolean (*trackBox)(WindowRef theWindow, Point thePt, short partCode);
  24. trackBox gTrackBoxAddr;
  25. pascal Boolean MyTrackBox(WindowRef theWindow, Point thePt, short partCode);
  26.  
  27. typedef pascal ControlPartCode (*findControl)(Point thePoint, WindowRef theWindow, ControlRef *theControl);
  28. findControl gFindControlAddr;
  29. pascal ControlPartCode MyFindControl(Point thePoint, WindowRef theWindow, ControlRef *theControl);
  30.  
  31. typedef pascal ControlPartCode (*testControl)(ControlRef theControl, Point thePoint);
  32. testControl gTestControlAddr;
  33. pascal ControlPartCode MyTestControl(ControlRef theControl, Point thePoint);
  34.  
  35. ControlPartCode GetChangedPartCode(ControlPartCode part);
  36.  
  37. typedef pascal void (*hiliteControl)(ControlRef theControl, ControlPartCode hiliteState);
  38. hiliteControl gHiliteControlAddr;
  39. pascal void MyHiliteControl(ControlRef theControl, ControlPartCode hiliteState);
  40.  
  41. typedef pascal void (*setControlValue)(ControlRef theControl, SInt16 newValue);
  42. setControlValue gSetControlValueAddr;
  43. pascal void MySetControlValue(ControlRef theControl, SInt16 newValue);
  44.  
  45. void main(void) {
  46.     Handle init;
  47.  
  48.     EnterCodeResource();
  49.     
  50.     init = Get1Resource('INIT', 0);
  51.     DetachResource(init);
  52.     
  53.     gFindWindowAddr = (findWindow)NGetTrapAddress(_FindWindow, ToolTrap);
  54.     NSetTrapAddress((UniversalProcPtr)MyFindWindow, _FindWindow, ToolTrap);
  55.     
  56.     gTrackGoAwayAddr = (trackGoAway)NGetTrapAddress(_TrackGoAway, ToolTrap);
  57.     NSetTrapAddress((UniversalProcPtr)MyTrackGoAway, _TrackGoAway, ToolTrap);
  58.  
  59.     gTrackBoxAddr = (trackBox)NGetTrapAddress(_TrackBox, ToolTrap);
  60.     NSetTrapAddress((UniversalProcPtr)MyTrackBox, _TrackBox, ToolTrap);
  61.     
  62.     gFindControlAddr = (findControl)NGetTrapAddress(_FindControl, ToolTrap);
  63.     NSetTrapAddress((UniversalProcPtr)MyFindControl, _FindControl, ToolTrap);
  64.  
  65.     gTestControlAddr = (testControl)NGetTrapAddress(_TestControl, ToolTrap);
  66.     NSetTrapAddress((UniversalProcPtr)MyTestControl, _TestControl, ToolTrap);
  67.  
  68.     gHiliteControlAddr = (hiliteControl)NGetTrapAddress(_HiliteControl, ToolTrap);
  69.     NSetTrapAddress((UniversalProcPtr)MyHiliteControl, _HiliteControl, ToolTrap);
  70. /*
  71.     gSetControlValueAddr = (setControlValue)NGetTrapAddress(_SetControlValue, ToolTrap);
  72.     NSetTrapAddress((UniversalProcPtr)MySetControlValue, _SetControlValue, ToolTrap);
  73.     gScrollDefProc = GetResource('CDEF', 1);
  74. */
  75.     ExitCodeResource();
  76. }
  77.  
  78. pascal short MyFindWindow(Point thePoint, WindowRef *theWindow) {
  79.     short part;
  80.     EnterCodeResource();
  81.     
  82.     part = gFindWindowAddr(thePoint, theWindow);
  83.     
  84.     if (part == inZoomIn || part == inZoomOut) {
  85.         if (GetWindowGoAwayFlag(*theWindow) == true) {
  86.             gRealFunctionsEnabled = false;
  87.             gPartCode = part;
  88.             part = inGoAway;
  89.         }
  90.     }
  91.     else if (part == inGoAway) {        
  92.         switch (GetWVariant(*theWindow)) {
  93.             case documentProc: // no zoom box
  94.             case noGrowDocProc:
  95.             case rDocProc:
  96.                 break;
  97.             default:
  98.                 gRealFunctionsEnabled = false;
  99.                 if (GetWindowZoomFlag(theWindow) == true) part = inZoomOut;
  100.                 else part = inZoomIn;
  101.                 break;
  102.         }
  103.     }
  104.     else if (part == inDrag) {
  105.         if (*theWindow == FrontWindow()) {            
  106.             switch (GetWVariant(*theWindow)) {
  107.                 case noGrowDocProc: // no grow box
  108.                 case zoomNoGrow:
  109.                 case movableDBoxProc:
  110.                 case rDocProc:
  111.                     break;
  112.                 default:
  113.                     // allow cmd-click in titlebar in finder and windowshade?
  114.                     gRealFunctionsEnabled = false;
  115.                     part = inGrow;
  116.                     break;
  117.             }
  118.         }
  119.     }
  120.     else if (part == inGrow) {
  121.         gRealFunctionsEnabled = false;
  122.         part = inDrag;
  123.     }
  124.     
  125.     ExitCodeResource();
  126.     return part;
  127. }
  128.  
  129. pascal Boolean MyTrackGoAway(WindowRef theWindow, Point thePt) {
  130.     Boolean selected;
  131.     EnterCodeResource();
  132.     if (gRealFunctionsEnabled) {
  133.         selected = gTrackGoAwayAddr(theWindow, thePt);
  134.     }
  135.     else { // they clicked in the zoom box
  136.         selected = gTrackBoxAddr(theWindow, thePt, gPartCode);
  137.         gRealFunctionsEnabled = true;
  138.     }
  139.     ExitCodeResource();
  140.     return selected;
  141. }
  142.  
  143. pascal Boolean MyTrackBox(WindowRef theWindow, Point thePt, short partCode) {
  144.     Boolean selected;
  145.     EnterCodeResource();
  146.     if (gRealFunctionsEnabled) {
  147.         selected = gTrackBoxAddr(theWindow, thePt, partCode);
  148.     }
  149.     else { // they clicked in the close box
  150.         selected = gTrackGoAwayAddr(theWindow, thePt);
  151.         gRealFunctionsEnabled = true;
  152.     }
  153.     ExitCodeResource();
  154.     return selected;
  155. }
  156.  
  157. ControlPartCode GetChangedPartCode(ControlPartCode part) {
  158.     if (part == kControlUpButtonPart) {
  159.         //gScrollGoingUp = false;
  160.         //gKnowScrollDirection = true;
  161.         return kControlDownButtonPart;
  162.     }
  163.     else if (part == kControlDownButtonPart) {
  164.         //gScrollGoingUp = false;
  165.         //gKnowScrollDirection = true;
  166.         return kControlUpButtonPart;
  167.     }
  168.     else if (part == kControlPageUpPart) {
  169.         //gScrollGoingUp = false;
  170.         //gKnowScrollDirection = true;
  171.         return kControlPageDownPart;
  172.     }
  173.     else if (part == kControlPageDownPart) {
  174.         //gScrollGoingUp = true;
  175.         //gKnowScrollDirection = true;
  176.         return kControlPageUpPart;
  177.     }
  178.     else {
  179.         //gKnowScrollDirection = false;
  180.         return part;
  181.     }
  182. }
  183.  
  184. pascal ControlPartCode MyFindControl(Point thePoint, WindowRef theWindow, ControlRef *theControl) {
  185.     EnterCodeResource();
  186.     
  187.     ControlPartCode part = GetChangedPartCode(gFindControlAddr(thePoint, theWindow, theControl));
  188.     gRealFunctionsEnabled = false;
  189.     
  190.     ExitCodeResource();
  191.     return part;
  192. }
  193.  
  194. pascal ControlPartCode MyTestControl(ControlRef theControl, Point thePoint) {
  195.     EnterCodeResource();
  196.     
  197.     ControlPartCode part = GetChangedPartCode(gTestControlAddr(theControl, thePoint));
  198.     gRealFunctionsEnabled = false;
  199.     
  200.     ExitCodeResource();
  201.     return part;
  202. }
  203.  
  204. pascal void MyHiliteControl(ControlRef theControl, ControlPartCode hiliteState) {
  205.     EnterCodeResource();
  206.     
  207.     if (gRealFunctionsEnabled) {
  208.         gHiliteControlAddr(theControl, hiliteState);
  209.     }
  210.     else {
  211.         gHiliteControlAddr(theControl, GetChangedPartCode(hiliteState));
  212.     }
  213.     
  214.     ExitCodeResource();
  215. }
  216.  
  217. pascal void MySetControlValue(ControlRef theControl, SInt16 newValue) {
  218.     EnterCodeResource();
  219.  
  220.     ControlHandle control = (ControlHandle)theControl;
  221.     if (gScrollDefProc == (*control)->contrlDefProc) {
  222.         if (gKnowScrollDirection && (gScrollGoingUp && newValue < (*control)->contrlValue || !gScrollGoingUp && newValue > (*control)->contrlValue)) {
  223.             gSetControlValueAddr(control, newValue);
  224.             gKnowScrollDirection = false;
  225.         }
  226.         else { // invert it
  227.             gSetControlValueAddr(control, (*control)->contrlMax - (newValue - (*control)->contrlMin));
  228.         }
  229.     }
  230.     else {
  231.         gSetControlValueAddr(control, newValue);
  232.     }
  233.  
  234.     ExitCodeResource();
  235. }